package com.api.test;

import java.util.Date;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import com.huitone.smspfm.socket.core.DefaultMessageHandler;
import com.huitone.smspfm.socket.core.SocketHolder;
import com.huitone.smspfm.socket.protocol.sgip.constant.CommandID;
import com.huitone.smspfm.socket.protocol.sgip.message.Message;
import com.huitone.smspfm.socket.protocol.sgip.message.msgbody.Deliver;
import com.huitone.smspfm.socket.protocol.sgip.message.msgbody.DeliverResp;
import com.huitone.smspfm.socket.protocol.sgip.message.msgbody.Report;
import com.huitone.smspfm.socket.protocol.sgip.message.msgbody.ReportResp;
import com.huitone.smspfm.socket.protocol.sgip.message.msgbody.Resp;
import com.huitone.smspfm.socket.protocol.sgip.message.msghead.Head;

/**
* @Title ClientServerMessageHandler.java
* @Package com.huitone.smspfm.client.core
* @Description TODO(用一句话描述该文件做什么)
* @author ybliang
* @date 2017年4月5日 上午10:53:46
* @version V1.0
*/
public class ClientServerMessageHandler extends DefaultMessageHandler {

	private static final Logger logger = LogManager.getLogger(ClientServerMessageHandler.class);

	@Override
	public void handleDeliverMessage(Head head, Deliver body, SocketHolder socketHolder) {
		logger.info("handleDeliverMessage接收到接口程序推送的上行短信信息");
		String serialNo = head.getSerialNo(); // 序列号
		String msgContent = body.getMsgContent(); // 短信内容
		String recvTime = body.getRecvTime(); // 接收时间
		String sendPort = body.getSendPort(); // 发送端口号
		String userNumber = body.getUserNumber(); // 用户号码

		// 注意:接收到报告信息后需要返回响应,否则短信平台将重发三次
		response(head, DeliverResp.class, 0, CommandID.SGIP_DELIVER_RESP, socketHolder);
		
	}

	@Override
	public void handleReportMessage(Head head, Report body, SocketHolder socketHolder) {
		logger.info("handleReportMessage接收到接口程序推送的报告信息");
		
		String currSerialNo = head.getSerialNo(); // 当前的序列号
		String submitSerialNo = body.getSerialNo(); // 对应于下发短信的序列号
		int reportType = body.getReportType(); // 报告类型 0 发送到网关 1 发送到用户手机
		String userNumber = body.getUserNumber(); // 用户号码
		int errorCode = body.getErrorCode(); // 错误码
		String errorMsg = body.getErrorMsg(); // 错误说明
		System.out.println(currSerialNo+"  ||  "+submitSerialNo +" || "+reportType+" || "+ userNumber+" || "+errorCode+" || "+errorMsg);
		
		// 注意:接收到报告信息后需要返回响应,否则短信平台将重发三次
		response(head, ReportResp.class, 0, CommandID.SGIP_REPORT_RESP, socketHolder);
		checkIsQuit(reportType,errorCode);
	}

	private void checkIsQuit(int reportType,int errorCode) {
//		if(reportType == 1 && errorCode == 0){
			if(Config.reportStratDate == null){
				Config.reportStratDate = new Date();
			}
			Config.reportCntTmp++;
//			if ((Config.reportCnt+Config.reportCntTmp) >= (Config.LOOP_TIMES)) {
//				Config.QUIT_FLAG = true;
//
//			}
//		}
			
		
	}

	/**
	 * @param head 接收的消息头
	 * @param clazz 响应信息的body类
	 * @param result 接收消息的处理结果
	 * @param commandID 命令ID
	 * @param outputStream 客户端输出流
	 * @return 发送响应是否成功了
	 */
	public boolean response(Head head, Class<? extends Resp> clazz, int result, long commandID, SocketHolder socketHolder) {

		boolean respResult = true;

		try {

			Resp resp = clazz.newInstance();
			resp.setResult(result);

			Head headResp = Head.build(resp.length(), commandID, head.getSerialNoPart1(), head.getSerialNoPart2(), head.getSerialNoPart3());

			socketHolder.write(Message.build(headResp, resp));

		} catch (Exception e) {
			respResult = false;
			logger.error("响应消息"+clazz.getName()+"报错.", e);
		}

		return respResult;
	}
}
